/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ftp;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

/**
 *
 * @author Gilmario
 */
public class FtpFunction implements Runnable {

    private String usuario;
    private String senha;
    private FTPClient ftp;
    private String servidor;
    private String localRemoto;
    private File file;
    private int action;
    private List<String> files;

    public String getServidor() {
        return servidor;
    }

    public int getAction() {
        return action;
    }

    public void setAction(int action) {
        this.action = action;
    }

    public void setServidor(String servidor) {
        this.servidor = servidor;
    }

    public FtpFunction(String usuario, String senha, String servidor, String localRemoto) {
        this.usuario = usuario;
        this.senha = senha;
        this.ftp = new FTPClient();
        this.servidor = servidor;
        this.localRemoto = localRemoto;
    }

    private void conect() {
        try {
            ftp.connect(servidor);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Sem conecção \r\n Refaça as configurações");
        }
    }

    public boolean mudarPastaRemota(String local) throws Exception {
        return ftp.changeWorkingDirectory(local);
    }

    public void logar() {
        try {
            conect();
            ftp.login(usuario, senha);
            ftp.changeWorkingDirectory(localRemoto);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Desconectado");
        }
    }

    public boolean criarDiretorio(String dir) {
        try {
            return ftp.makeDirectory(dir);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
            return false;
        }
    }

    public void atuar() {
        Thread h = new Thread(this);
        h.start();
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public boolean excluirDiretorio(String dir) {
        try {
            return ftp.removeDirectory(dir);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
            return false;
        }
    }

    public void enviar() {
        this.enviarBinario(file);
    }

    public boolean deletar(String arquivo) {
        try {
            return ftp.deleteFile(arquivo);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao excluir arquivo" + e);
            return false;
        }
    }

    public List<String> listaInfArquivos() {
        List<String> lista = new ArrayList<String>();
        int i = 0;
        try {
            FTPFile[] lf = ftp.listFiles();
            while (i < lf.length) {
                if (lf[i].getSize() / 1024 > 1024) {
                    lista.add(lf[i].getName() + "   " + lf[i].getSize() / 1024 / 1024 + " MBytes");
                } else if (lf[i].getSize() > 1024) {
                    lista.add(lf[i].getName() + "   " + (lf[i].getSize() / 1024) + " KBytes");
                } else {
                    lista.add(lf[i].getName() + "   " + lf[i].getSize() / 1024 + " Bytes");
                }
                i++;
            }
            return lista;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro " + e);
            return null;
        }
    }

    public List<String> listaArquivos() {
        List<String> lista = new ArrayList<String>();
        int i = 0;
        try {
            String[] f = ftp.listNames();
            while (i < f.length) {
                lista.add(f[i]);
                i++;
            }
            return lista;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro " + e);
            return null;
        }
    }

    public void printfile0s() {
        List<String> lista = new ArrayList<String>();
        try {
            List<FTPFile> fs = new ArrayList<FTPFile>();
            String[] fff = ftp.listNames();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro " + e);
            e.printStackTrace();
        }
    }

    public void desconectar() {
        try {
            ftp.disconnect();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "O Servidor não existe!");
        }
    }

    public boolean enviarBinario(File arquivo) {
        try {
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            InputStream is = new FileInputStream(arquivo);
            BufferedInputStream bf = new BufferedInputStream(is);
            return ftp.storeFile(arquivo.getName(), bf);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Arquivo Error" + e);
            return false;
        }
    }

    public boolean receberBinario(String arquivo, String local) {
        try {
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            FileOutputStream fo = new FileOutputStream(local);
            return ftp.retrieveFile(arquivo, fo);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Arquivo Error" + e);
            return false;
        }
    }

    private void enviarTexto(File arquivo) {
        try {
            ftp.setFileType(FTPClient.ASCII_FILE_TYPE);
            ftp.storeFileStream(arquivo.getName());
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Arquivo Error" + e);
        }
    }

    public boolean isConectado() {
        return ftp.isConnected();
    }

    public String getLocalRemoto() {
        return localRemoto;
    }

    public void setLocalRemoto(String localRemoto) {
        this.localRemoto = localRemoto;
    }

    public static void main(String args[]) {
    }

    public void run() {
        try {
            switch (action) {
                case 0:
                    mudarPastaRemota(localRemoto);
                    break;
                case 1:
                    enviar();
                    break;
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro " + e);
        }
    }
}